{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "from torchvision import datasets, transforms\n",
    "import matplotlib.pyplot as plt\n",
    "import os\n",
    "import torchvision\n",
    "import numpy as np\n",
    "from torch.autograd import Variable\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "transform = transforms.Compose([transforms.ToTensor(),\n",
    "                               transforms.Normalize(mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5])])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "data_train = datasets.MNIST(root = \"./data/\",\n",
    "                            transform=transform,\n",
    "                            train = True,\n",
    "                            download = True)\n",
    "\n",
    "data_test = datasets.MNIST(root=\"./data/\",\n",
    "                           transform = transform,\n",
    "                           train = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "data_loader_train = torch.utils.data.DataLoader(dataset=data_train,\n",
    "                                                batch_size = 64,\n",
    "                                                shuffle = True,\n",
    "                                                 num_workers=2)\n",
    "\n",
    "data_loader_test = torch.utils.data.DataLoader(dataset=data_test,\n",
    "                                               batch_size = 64,\n",
    "                                               shuffle = True,\n",
    "                                                num_workers=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "60000\n"
     ]
    }
   ],
   "source": [
    "print(len(data_train))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0, 8, 0, 7, 9, 5, 5, 7, 7, 1, 0, 8, 3, 6, 7, 3, 6, 4, 1, 4, 5, 0, 9, 3, 2, 1, 2, 7, 7, 4, 1, 3, 8, 4, 2, 5, 1, 4, 5, 6, 6, 9, 4, 3, 1, 5, 0, 9, 1, 6, 3, 6, 8, 0, 4, 1, 3, 3, 4, 4, 1, 1, 6, 4]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x26d44a57c88>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x26d43856f98>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "images, labels = next(iter(data_loader_train))\n",
    "img = torchvision.utils.make_grid(images)\n",
    "\n",
    "img = img.numpy().transpose(1,2,0)\n",
    "std = [0.5,0.5,0.5]\n",
    "mean = [0.5,0.5,0.5]\n",
    "img = img*std+mean\n",
    "print([labels[i] for i in range(64)])\n",
    "plt.imshow(img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class Model(torch.nn.Module):\n",
    "    \n",
    "    def __init__(self):\n",
    "        super(Model, self).__init__()\n",
    "        self.conv1 = torch.nn.Sequential(torch.nn.Conv2d(1,64,kernel_size=3,stride=1,padding=1),\n",
    "                                         torch.nn.ReLU(),\n",
    "                                         torch.nn.Conv2d(64,128,kernel_size=3,stride=1,padding=1),\n",
    "                                         torch.nn.ReLU(),\n",
    "                                         torch.nn.MaxPool2d(stride=2,kernel_size=2))\n",
    "        self.dense = torch.nn.Sequential(torch.nn.Linear(14*14*128,1024),\n",
    "                                         torch.nn.ReLU(),\n",
    "                                         torch.nn.Dropout(p=0.5),\n",
    "                                         torch.nn.Linear(1024, 10))\n",
    "    def forward(self, x):\n",
    "        x = self.conv1(x)\n",
    "        #x = self.conv2(x)\n",
    "        x = x.view(-1, 14*14*128)\n",
    "        x = self.dense(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model = Model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model (\n",
      "  (conv1): Sequential (\n",
      "    (0): Conv2d(1, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "    (1): ReLU ()\n",
      "    (2): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "    (3): ReLU ()\n",
      "    (4): MaxPool2d (size=(2, 2), stride=(2, 2), dilation=(1, 1))\n",
      "  )\n",
      "  (dense): Sequential (\n",
      "    (0): Linear (25088 -> 1024)\n",
      "    (1): ReLU ()\n",
      "    (2): Dropout (p = 0.5)\n",
      "    (3): Linear (1024 -> 10)\n",
      "  )\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "print(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "cost = torch.nn.CrossEntropyLoss()\n",
    "optimizer = torch.optim.Adam(model.parameters())\n",
    "n_epochs = 5\n",
    "model.load_state_dict(torch.load('model_parameter.pkl'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 0/5\n",
      "----------\n",
      "Loss is:0.0003, Train Accuracy is:99.4167%, Test Accuracy is:98.6600\n",
      "Epoch 1/5\n",
      "----------\n",
      "Loss is:0.0002, Train Accuracy is:99.5967%, Test Accuracy is:98.9200\n",
      "Epoch 2/5\n",
      "----------\n",
      "Loss is:0.0002, Train Accuracy is:99.6667%, Test Accuracy is:98.7700\n",
      "Epoch 3/5\n",
      "----------\n",
      "Loss is:0.0002, Train Accuracy is:99.7133%, Test Accuracy is:98.9600\n",
      "Epoch 4/5\n",
      "----------\n",
      "Loss is:0.0001, Train Accuracy is:99.7317%, Test Accuracy is:98.7300\n"
     ]
    }
   ],
   "source": [
    "\n",
    "for epoch in range(n_epochs):\n",
    "    running_loss = 0.0\n",
    "    running_correct = 0\n",
    "    print(\"Epoch {}/{}\".format(epoch, n_epochs))\n",
    "    print(\"-\"*10)\n",
    "    for data in data_loader_train:\n",
    "        X_train, y_train = data\n",
    "        X_train, y_train = Variable(X_train), Variable(y_train)\n",
    "        outputs = model(X_train)\n",
    "        _,pred = torch.max(outputs.data, 1)\n",
    "        optimizer.zero_grad()\n",
    "        loss = cost(outputs, y_train)\n",
    "        \n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        running_loss += loss.data[0]\n",
    "        running_correct += torch.sum(pred == y_train.data)\n",
    "    testing_correct = 0\n",
    "    for data in data_loader_test:\n",
    "        X_test, y_test = data\n",
    "        X_test, y_test = Variable(X_test), Variable(y_test)\n",
    "        outputs = model(X_test)\n",
    "        _, pred = torch.max(outputs.data, 1)\n",
    "        testing_correct += torch.sum(pred == y_test.data)\n",
    "    print(\"Loss is:{:.4f}, Train Accuracy is:{:.4f}%, Test Accuracy is:{:.4f}\".format(running_loss/len(data_train),\n",
    "                                                                                      100*running_correct/len(data_train),\n",
    "                                                                                      100*testing_correct/len(data_test)))\n",
    "torch.save(model.state_dict(), \"model_parameter.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Predict Label is: [3, 4, 9, 3]\n",
      "Real Label is: [3, 4, 9, 3]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x26d451b0dd8>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x26d44fe64a8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "data_loader_test = torch.utils.data.DataLoader(dataset=data_test,\n",
    "                                          batch_size = 4,\n",
    "                                          shuffle = True)\n",
    "X_test, y_test = next(iter(data_loader_test))\n",
    "inputs = Variable(X_test)\n",
    "pred = model(inputs)\n",
    "_,pred = torch.max(pred, 1)\n",
    "\n",
    "print(\"Predict Label is:\", [ i for i in pred.data])\n",
    "print(\"Real Label is:\",[i for i in y_test])\n",
    "\n",
    "img = torchvision.utils.make_grid(X_test)\n",
    "img = img.numpy().transpose(1,2,0)\n",
    "\n",
    "std = [0.5,0.5,0.5]\n",
    "mean = [0.5,0.5,0.5]\n",
    "img = img*std+mean\n",
    "plt.imshow(img)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "celltoolbar": "Raw Cell Format",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
